﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Windows.Forms.Design;

internal class NewItemsContextMenuStrip : GroupedContextMenuStrip
{
    private readonly IComponent _component;
    private readonly EventHandler _onClick;
    private readonly bool _convertTo;
    private readonly IServiceProvider _serviceProvider;
    private readonly ToolStripItem _currentItem;

    public NewItemsContextMenuStrip(
        IComponent component,
        ToolStripItem currentItem,
        EventHandler onClick,
        bool convertTo,
        IServiceProvider serviceProvider)
    {
        _component = component;
        _onClick = onClick;
        _convertTo = convertTo;
        _serviceProvider = serviceProvider;
        _currentItem = currentItem;
        if (serviceProvider.TryGetService(out IUIService? uis))
        {
            Renderer = (ToolStripProfessionalRenderer)uis.Styles["VsRenderer"]!;
        }
    }

    protected override void OnOpening(CancelEventArgs e)
    {
        Groups["StandardList"].Items.Clear();
        Groups["CustomList"].Items.Clear();
        Populated = false;

        // plumb through the standard and custom items.
        foreach (ToolStripItem item in ToolStripDesignerUtils.GetStandardItemMenuItems(_component, _onClick, _convertTo))
        {
            Groups["StandardList"].Items.Add(item);
            if (_convertTo)
            {
                if (item is ItemTypeToolStripMenuItem toolItem && _currentItem is not null && toolItem.ItemType == _currentItem.GetType())
                {
                    toolItem.Enabled = false;
                }
            }
        }

        foreach (ToolStripItem item in ToolStripDesignerUtils.GetCustomItemMenuItems(_component, _onClick, _convertTo, _serviceProvider))
        {
            Groups["CustomList"].Items.Add(item);
            if (_convertTo)
            {
                if (item is ItemTypeToolStripMenuItem toolItem && _currentItem is not null && toolItem.ItemType == _currentItem.GetType())
                {
                    toolItem.Enabled = false;
                }
            }
        }

        base.OnOpening(e);
    }

    // We don't want the runtime behavior for this Design Time only DropDown and hence we override
    // the ProcessDialogKey and just close the DropDown instead of running through the runtime implementation
    // for RIGHT/LEFT Keys which ends up setting ModalMenuFilter.
    protected override bool ProcessDialogKey(Keys keyData)
    {
        Keys keyCode = keyData & Keys.KeyCode;
        switch (keyCode)
        {
            case Keys.Left:
            case Keys.Right:
                Close();
                return true;
        }

        return base.ProcessDialogKey(keyData);
    }
}
